package org.jctools.queues;

import static org.jctools.util.UnsafeRefArrayAccess.REF_ARRAY_BASE;
import static org.jctools.util.UnsafeRefArrayAccess.REF_ELEMENT_SHIFT;

/**
 * This is used for method substitution in the LinkedArray classes code generation.
 */
final class LinkedArrayQueueUtil
{
    static int length(Object[] buf)
    {
        return buf.length;
    }

    /**
     * This method assumes index is actually (index << 1) because lower bit is
     * used for resize. This is compensated for by reducing the element shift.
     * The computation is constant folded, so there's no cost.
     */
    static long modifiedCalcCircularRefElementOffset(long index, long mask)
    {
        // index & mask , 对着mask 取模
        // index 的值，已经 <<1 了，
        // 所以，这里需要  << (REF_ELEMENT_SHIFT - 1)

        // 数组的 索引，之前是以对象为单位， 换成  字节为单位
        // 1  , << 2
        // pindex 并不是 数组的 原始索引，而是已经 乘以2 了的，或者 已经<< 1 了的， 所以，<< REF_ELEMENT_SHIFT - 1
        return REF_ARRAY_BASE + ((index & mask) << (REF_ELEMENT_SHIFT - 1));
    }

    static long nextArrayOffset(Object[] curr)
    {
        return REF_ARRAY_BASE + ((long) (length(curr) - 1) << REF_ELEMENT_SHIFT);
    }
}
